Qt Creator格式化C++代码 您所在的位置:网站首页 qt 格式化快捷键 Qt Creator格式化C++代码

Qt Creator格式化C++代码

2024-04-30 14:22| 来源: 网络整理| 查看: 265

封面图

因为代码由多人合作开发,且代码格式风格各异,导致同一项目,甚至同一个源文件中,代码风格都各不同。为了更好阅读、修改代码,尽可能做到统一代码风格,因此引入QT Creator 插件和clang-format来实现此目标。

本文主要介绍如何在ubuntu20.04平台的Qt Creator中使用快捷键格式化C/C++代码。主要包括几个步骤 (1)安装clang-format-15 (2)安装和配置Qt Creator插件Beautifier (3)配置格式化快捷键

安装clang-format-15

clang-format 是 Clang 编译器中的一个工具,可以方便的自动规范多种语言的格式,使得不同人写的代码有统一的编码格式,方便团队代码的统一管理以及后期的代码审核。

为什么使用clang-format,而不是Qt Creator自身的格式化工具? 主要是clang-format可跨平台,支持不同的IDE,支持不同的语言,可配置的格式丰富,一套格式走天下。

ubuntu20.04本身自带的clang-format的版本是10,版本偏低,不支持使用最新的格式。本文安装的是clang-format-15,步骤如下:

(1)获取key

wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - 

(2)在 /etc/apt/sources.list配置源

deb http://apt.llvm.org/focal/ llvm-toolchain-focal-15 main deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-15 main

(3)安装clang-format-15

sudo apt update sudo apt install clang-format-15 安装和配置Qt Creator插件Beautifier

(1)菜单栏-帮助-关于插件,勾选插件Beautifier,然后重启Qt Creator。

(2)重启完毕后,菜单栏-工具-选项,即可看到Beautifier选项框,配置如下。格式模板见附件

配置格式化快捷键

可以按个人喜好配置快捷键,如下图,使用Alt+L格式化当选行或选择的代码块,使用Ctrl+Shift+L格式化当前文件。

使用建议

(1)只在新增源文件时使用全文件格式化,旧文件不建议使用全文件格式化,不利于代码版本跟踪。 (2)修改代码、新增代码时,建议使用代码块格式化,逐步达到代码统一格式。

格式模板

以下是以 Microsoft 是模板,并结合个人风格习惯来定制的代码格式

# https://clang.llvm.org/docs/ClangFormatStyleOptions.html # https://www.bbsmax.com/A/VGzlMjexJb/ # 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto Language: Cpp BasedOnStyle: Microsoft # 访问说明符(public、private等)的偏移,-4与类名对齐 AccessModifierOffset: -4 # 左括号(左圆括号、左尖括号、左方括号)后的参数对齐: Align, DontAlign, AlwaysBreak(总是在左括号后换行) AlignAfterOpenBracket: Align # 在对结构数组使用初始化时,将字段对齐到列中 Left Right None AlignArrayOfStructures: Left # 连续赋值时,对齐所有等号 AlignConsecutiveAssignments: true # 对齐连续位的样式 连续位域时,对齐所有冒号 AlignConsecutiveBitFields: true # 连续声明时,对齐所有声明的变量名 AlignConsecutiveDeclarations: true # 对齐连续位域字段的风格 # AlignConsecutiveBitFields: AcrossEmptyLinesAndComments # 对齐连续宏定义的风格 #AlignConsecutiveMacros: Consecutive #clang-format 12 # 用于在使用反斜杠换行中对齐反斜杠的选项 AlignEscapedNewlines: Left # 水平对齐二元和三元表达式的操作数 AlignOperands: true # 对齐连续的尾随的注释 AlignTrailingComments: true # 如果函数调用或带括号的初始化列表不适合全部在一行时 # 允许将所有参数放到下一行,即使BinPackArguments为false AllowAllArgumentsOnNextLine: true # 允许构造函数的初始化参数放在下一行 AllowAllConstructorInitializersOnNextLine: true # 允许函数声明的所有参数在放在下一行 AllowAllParametersOfDeclarationOnNextLine: true # 允许短的块放在同一行(Always 总是将短块合并成一行,Empty 只合并空块) AllowShortBlocksOnASingleLine: Empty # 允许短的case标签放在同一行 AllowShortCaseLabelsOnASingleLine: false # 允许短的枚举在同一行 AllowShortEnumsOnASingleLine: false # V11 # 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All AllowShortFunctionsOnASingleLine: InlineOnly # 允许短的if语句保持在同一行 AllowShortIfStatementsOnASingleLine: Never # 允许短的Lambda表达式保持在同一行,Inline(做为函数参数时) Empty AllowShortLambdasOnASingleLine: Empty # 允许短的循环保持在同一行 AllowShortLoopsOnASingleLine: false # 总是在定义返回类型后换行(deprecated) AlwaysBreakAfterDefinitionReturnType: None # 总是在返回类型后换行: None, All, TopLevel(顶级函数,不包括在类中的函数), # AllDefinitions(所有的定义,不包括声明), TopLevelDefinitions(所有的顶级函数的定义) # 函数声明返回类型后是否换行(None 自动,All全部,TopLevel...) AlwaysBreakAfterReturnType: None # 总是在多行string字面量前换行 AlwaysBreakBeforeMultilineStrings: false # 总是在template声明后换行 AlwaysBreakTemplateDeclarations: Yes # false表示函数实参要么都在同一行,要么都各自一行 BinPackArguments: true # false表示所有形参要么都在同一行,要么都各自一行 BinPackParameters: true # 位域的冒号左右是否有空格 Both None Before After BitFieldColonSpacing: Both # 大括号换行,只有当 BreakBeforeBraces 设置为Custom时才有效 BraceWrapping: # case 语句后面 AfterCaseLabel: true # class定义后面 AfterClass: true # 控制语句后面 AfterControlStatement: true # enum定义后面 AfterEnum: true # 函数定义后面 AfterFunction: true # 命名空间定义后面 AfterNamespace: true # ObjC定义后面 AfterObjCDeclaration: false # struct定义后面 AfterStruct: true # union定义后面 AfterUnion: true # extern 导出块后面 AfterExternBlock: true # catch之前 BeforeCatch: true # else之前 BeforeElse: true # lambda表达式的执行体前 BeforeLambdaBody: false # do-while的while前 BeforeWhile: false # 缩进大括号(整个大括号框起来的部分都缩进) IndentBraces: false # 空函数的大括号是否分开,true(分开) SplitEmptyFunction: true # 空记录体(struct/class/union)的大括号是否分开,true(分开) SplitEmptyRecord: true # 空名字空间的大括号是否分开,true(分开) SplitEmptyNamespace: true # 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行) BreakBeforeBinaryOperators: All # 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义,与Attach类似), # Mozilla(除枚举、函数、记录定义,与Attach类似), Stroustrup(除函数定义、catch、else,与Attach类似), # Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom # 注:这里认为语句块也属于函数 # 大括号的换行规则 BreakBeforeBraces: Custom # 三元运算操作符换行位置(?和: 在新行还是尾部) BreakBeforeTernaryOperators: true # 在构造函数的初始化列表的逗号前换行 BreakConstructorInitializersBeforeComma: false # 要使用的构造函数初始化式样式 BreakConstructorInitializers: BeforeColon # 类声明时基类的样式 BreakInheritanceList: BeforeColon # 是否允许字符串字面值换行 BreakStringLiterals: true # 每行字符的限制,0表示没有限制 ColumnLimit: 0 # 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变 # CommentPragmas: '' # 如果为true,则连续的名称空间声明将在同一行上。如果为false,则在新行上声明每个名称空间。 CompactNamespaces: false # 构造函数的初始化列表要么都在同一行,要么都各自一行 ConstructorInitializerAllOnOneLineOrOnePerLine: false # 构造函数的初始化列表的缩进宽度 ConstructorInitializerIndentWidth: 4 # 延续的行的缩进宽度 ContinuationIndentWidth: 4 # 去除C++11的列表初始化的大括号{后和}前的空格 Cpp11BracedListStyle: true # 继承当前文档的换行方式(\r\n 或 \n) DeriveLineEnding: true # 继承当前文档的最常用的指针和引用的对齐方式 DerivePointerAlignment: false # 关闭格式化 DisableFormat: false # 在访问控制(public private protected)后是否有空行,Never Leave Always EmptyLineAfterAccessModifier: Leave # 在访问控制(public private protected)前是否有空行,Never Leave Always EmptyLineBeforeAccessModifier: Always # 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental) ExperimentalAutoDetectBinPacking: false # 如果为true,则clang格式会为短名称空间添加缺少的名称空间结尾注释,并修复无效的现有名称结束注释 FixNamespaceComments: true # 需要被解读为foreach循环而不是函数调用的宏 ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] # 头文件排序与分组,Preserve(各块单独排序),Merge(合到一起排序),Regroup(一起排序,再分组) IncludeBlocks: Regroup # 对#include进行排序,匹配了某正则表达式的#include拥有对应的优先级,匹配不到的则默认优先级为INT_MAX(优先级越小排序越靠前), # 可以定义负数优先级从而保证某些#include永远在最前面 IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 - Regex: '^(


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有